﻿using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioTela : IRepositorioTela
    {
        public Tela Inserir(Tela tela)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Save(tela);
            return tela;
        }

        public Tela Atualizar(Tela tela)
        {
            Tela tmpTela = ObterPorId(tela.TelaId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpTela.Codigo = tela.Codigo;
            tmpTela.Descricao = tela.Descricao;
            tmpTela.NomeAcao = tela.NomeAcao;
            tmpTela.NomeExibicao = tela.NomeExibicao;
            tmpTela.NomeObjeto = tela.NomeObjeto;
            tmpTela.ListaSistema.Clear();
            foreach (Sistema sistema in tela.ListaSistema)
            {
                tmpTela.AdicionarSistema(sistema);
            }

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpTela);
            return tmpTela;
        }

        public void Excluir(Tela tela)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(tela);
        }

        public IList<Tela> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Tela));
            return criteria.List<Tela>() as List<Tela>;
        }

        public IList<Tela> ObterTodos(int inicio, int quantidade, int quantidadeMinima, string codigo, string descricao)
        {
            if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Tela))
                .SetFirstResult(inicio).SetMaxResults(quantidade);

            if(!string.IsNullOrEmpty(codigo))
            {
                criteria.Add(Restrictions.Eq("Codigo", codigo));
            }

            if (!string.IsNullOrEmpty(descricao))
            {
                criteria.Add(Restrictions.Like("Descricao", descricao, MatchMode.Anywhere));
            }

            return criteria.List<Tela>() as List<Tela>;
        }

        public Tela ObterPorCodigo(string codigo)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Tela))
                .Add(Restrictions.Eq("Codigo", codigo));

            return criteria.UniqueResult<Tela>() as Tela;
        }

        public Tela ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Tela>(id);
        }
    }
}